home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 010 / games.arc / PLOT-3D.BAS (.txt) < prev    next >
Encoding:
GW-BASIC  |  1980-01-01  |  4.9 KB  |  168 lines

  1. 10  '*******************
  2. 20  '**    PLOT-3D    **
  3. 30  '*******************
  4. 40  '
  5. 50  CLEAR
  6. 60  SCREEN 2
  7. 70  KEY OFF
  8. 80  CLS
  9. 90  DIM HIGH%(640),LOW%(640)
  10. 100  DEF FNDTR(X) = X/57.2958
  11. 110  LINE (240,5)-(390,17),,B
  12. 120  LINE (236,3)-(394,19),,B
  13. 130  LINE (232,1)-(398,21),,B
  14. 140  LOCATE 2,37
  15. 150  PRINT "PLOT-3D"
  16. 160  PRINT
  17. 170  '
  18. 180  '********************************************
  19. 190  '**  Ask the user for the plot parameters  **
  20. 200  '********************************************
  21. 210  LOCATE 7,1
  22. 220  PRINT "Just a reminder ..."
  23. 230  LOCATE 8,12
  24. 240  PRINT "Your function Z=f(X,Y) should be defined at line 9000"
  25. 250  PRINT
  26. 260  INPUT "Enter X range ... Minimum, Maximum";XMIN,XMAX
  27. 270  PRINT
  28. 280  INPUT "Enter Y range ... Minimum, Maximum";YMIN,YMAX
  29. 290  PRINT
  30. 300  INPUT "Enter Z range ... Minimum, Maximum";ZMIN,ZMAX
  31. 310  PRINT
  32. 320  INPUT "Tilt angle (degrees)";TILT
  33. 330  PRINT
  34. 340  INPUT "Rotation angle (degrees)";ROTA
  35. 350  PRINT
  36. 360  INPUT "Number of X lines to plot";XLINES
  37. 370  PRINT
  38. 380  INPUT "Number of Y lines to plot";YLINES
  39. 390  PRINT
  40. 400  INPUT "Want hidden line removal (y/n) ";Q$
  41. 410  HIDE = 0
  42. 420  IF Q$ = "y" OR Q$ = "Y" THEN HIDE = 1
  43. 430  '
  44. 440  '***********************************************************************
  45. 450  '**  Much of the math is done only once ... speeding things up later  **
  46. 460  '***********************************************************************
  47. 470  CTILT = COS(FNDTR(TILT))
  48. 480  STILT = SIN(FNDTR(TILT))
  49. 490  CROTA = COS(FNDTR(ROTA))
  50. 500  SROTA = SIN(FNDTR(ROTA))
  51. 510  XMEAN = (XMAX+XMIN)/2
  52. 520  XDIFF = XMAX-XMIN
  53. 530  YMEAN = (YMAX+YMIN)/2
  54. 540  YDIFF = YMAX-YMIN
  55. 550  ZMEAN = (ZMAX+ZMIN)/2
  56. 560  ZDIFF = ZMAX-ZMIN
  57. 570  '
  58. 580  '***********************************
  59. 590  '**  Plot the X lines ... if any  **
  60. 600  '***********************************
  61. 610  CLS
  62. 620  LOCATE 9,23
  63. 630  IF XLINES < 2 THEN 810
  64. 640  IF HIDE = 0 THEN 680
  65. 650  PRINT "Initialization is taking place ..."
  66. 660  GOSUB 1260
  67. 670  CLS
  68. 680  FOR Y = YMAX TO YMIN STEP YDIFF/(1-XLINES)
  69. 690  FOR X = XMIN TO XMAX STEP XDIFF/50
  70. 700  XLAST = XPLOT
  71. 710  YLAST = YPLOT
  72. 720  GOSUB 1360
  73. 730  IF X = XMIN THEN 760
  74. 740  IF HIDE = 0 THEN LINE (XLAST,YLAST)-(XPLOT,YPLOT)
  75. 750  IF HIDE = 1 THEN GOSUB 1490
  76. 760  NEXT X,Y
  77. 770  '
  78. 780  '***********************************
  79. 790  '**  Plot the Y lines ... if any  **
  80. 800  '***********************************
  81. 810  IF YLINES < 2 THEN 960
  82. 820  IF HIDE THEN GOSUB 1260
  83. 830  FOR X = XMIN TO XMAX STEP XDIFF/(YLINES-1)
  84. 840  FOR Y = YMIN TO YMAX STEP YDIFF/50
  85. 850  XLAST = XPLOT
  86. 860  YLAST = YPLOT
  87. 870  GOSUB 1360
  88. 880  IF Y = YMIN THEN 910
  89. 890  IF HIDE = 0 THEN LINE (XLAST,YLAST)-(XPLOT,YPLOT)
  90. 900  IF HIDE = 1 THEN GOSUB 1490
  91. 910  NEXT Y,X
  92. 920  '
  93. 930  '*************************************************
  94. 940  '**  Review of plot parameters before quitting  **
  95. 950  '*************************************************
  96. 960  GOSUB 1180
  97. 970  CLS
  98. 980  PRINT "Your last plot had these parameters ..."
  99. 990  PRINT
  100. 1000  PRINT "The X values went from ";XMIN;"to ";XMAX
  101. 1010  PRINT "The Y values went from ";YMIN;"to ";YMAX
  102. 1020  PRINT "The Z axis went from ";ZMIN;"to ";ZMAX
  103. 1030  PRINT "The view was tilted ";TILT;"degrees"
  104. 1040  PRINT "The view was rotated ";ROTA;"degrees"
  105. 1050  PRINT XLINES;"lines were plotted in the X direction"
  106. 1060  PRINT YLINES;"lines were plotted in the Y direction"
  107. 1070  PRINT "The hidden line option was ";
  108. 1080  IF HIDE=0 THEN PRINT "not ";
  109. 1090  PRINT "selected"
  110. 1100  PRINT
  111. 1110  PRINT "Your defined function ..."
  112. 1120  PRINT
  113. 1130  LIST 9000-
  114. 1140  '
  115. 1150  '*********************************************************
  116. 1160  '**  Subroutine to wait until user is ready to proceed  **
  117. 1170  '*********************************************************
  118. 1180  LOCATE 24,1
  119. 1190  PRINT"Press any key to continue ...";
  120. 1200  K$ = INKEY$
  121. 1210  IF K$ = "" THEN 1200 ELSE RETURN
  122. 1220  '
  123. 1230  '*****************************************************************
  124. 1240  '**  Subroutine to initialize arrays for hidden line algorithm  **
  125. 1250  '*****************************************************************
  126. 1260  FOR I = 0 TO 640
  127. 1270  LOW%(I) = 200
  128. 1280  HIGH%(I) = 0
  129. 1290  NEXT I
  130. 1300  RETURN
  131. 1310  '
  132. 1320  '**************************************************************
  133. 1330  '**  Subroutine to project space points onto a plane taking  **
  134. 1340  '**  into account the tilt and rotation for the viewpoint    **
  135. 1350  '**************************************************************
  136. 1360  GOSUB 9000
  137. 1370  X2 = (X-XMEAN) / XDIFF
  138. 1380  Y2 = (Y-YMEAN) / YDIFF
  139. 1390  Z2 = (Z-ZMEAN) / ZDIFF
  140. 1400  X3 = X2 * CROTA - Y2 * SROTA
  141. 1410  Y3 = Z2 * CTILT - (X2 * SROTA + Y2 * CROTA) * STILT
  142. 1420  XPLOT = 320 + 370 * X3
  143. 1430  YPLOT = 100 - 116 * Y3
  144. 1440  RETURN
  145. 1450  '
  146. 1460  '******************************************************
  147. 1470  '**  Subroutine for plotting with hidden line check  **
  148. 1480  '******************************************************
  149. 1490  FOR XTST% = XLAST TO XPLOT STEP SGN(XPLOT-XLAST)
  150. 1500  PFLG = 0
  151. 1510  YTST% = YLAST + (XTST%-XLAST) * (YPLOT-YLAST) / (XPLOT-XLAST)
  152. 1520  IF LOW%(XTST%) <= YTST% THEN 1550
  153. 1530  LOW%(XTST%) = YTST%
  154. 1540  PFLG = 1
  155. 1550  IF HIGH%(XTST%) >= YTST% THEN 1580
  156. 1560  HIGH%(XTST%) = YTST%
  157. 1570  PFLG = 1
  158. 1580  IF PFLG = 1 THEN PSET(XTST%,YTST%)
  159. 1590  NEXT XTST%
  160. 1600  RETURN
  161. 1610  '
  162. 8970  '********************************************************
  163. 8980  '**  User function starts at line 9000 ... Z = f(X,Y)  **
  164. 8990  '********************************************************
  165. 9000  Z = SQR(X*X+Y*Y)
  166. 9010  IF Z <> 0 THEN Z = SIN(Z)/Z ELSE Z=1
  167. 9020  RETURN
  168.